home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
lisp
/
wgdb-42.lha
/
wgdb-4.2
/
libiberty
/
strtoul.c
< prev
Wrap
C/C++ Source or Header
|
1992-09-11
|
2KB
|
91 lines
/*
* strtol : convert a string to long.
*
* Andy Wilson, 2-Oct-89.
*/
#include <errno.h>
#include <ctype.h>
#include <stdio.h>
#include "ansidecl.h"
#define ULONG_MAX 0xFFFFFFFF
extern int errno;
unsigned long
strtoul(s, ptr, base)
CONST char *s; char **ptr; int base;
{
unsigned long total = 0, tmp = 0;
unsigned digit;
int radix;
CONST char *start=s;
int did_conversion=0;
if (s==NULL)
{
errno = ERANGE;
if (!ptr)
*ptr = (char *)start;
return 0L;
}
while (isspace(*s))
s++;
if (*s == '+')
s++;
radix = base;
if (base==0 || base==16)
{
/*
* try to infer radix from the string
* (assume decimal).
*/
if (*s=='0')
{
radix = 8; /* guess it's octal */
s++; /* (but check for hex) */
if (*s=='X' || *s=='x')
{
s++;
radix = 16;
}
}
}
if (radix==0)
radix = 10;
while ( digit = *s )
{
if (digit >= '0' && digit < ('0'+radix))
digit -= '0';
else
if (radix > 10)
{
if (digit >= 'a' && digit < ('a'+radix))
digit = digit - 'a' + 10;
else if (digit >= 'A' && digit < ('A'+radix))
digit = digit - 'A' + 10;
else
break;
}
else
break;
did_conversion = 1;
tmp = (total * radix) + digit;
if (tmp < total) /* check overflow */
{
errno = ERANGE;
if (ptr != NULL)
*ptr = (char *)s;
return (ULONG_MAX);
}
total = tmp;
s++;
}
if (ptr != NULL)
*ptr = (char *) ((did_conversion) ? (char *)s : start);
return (total);
}